/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef ACOLITOACTIVIDADES_H
#define ACOLITOACTIVIDADES_H

#include <QWidget>
#include <QSqlDatabase>
#include <QDataWidgetMapper>
#include <QSortFilterProxyModel>
#include <QSignalMapper>
#include <QPair>
#include <QDate>
#include <QSqlRecord>

#include <modeloactividades.h>
#include <addactividadesdialog.h>
#include <acolitocombobox.h>

namespace Ui {
    class AcolitoActividades;
}

/*!
   @brief Widget para controlar y visualizar las actividades del evento.

   */

class AcolitoActividades : public QWidget {
    Q_OBJECT

    Q_PROPERTY(bool conexion READ isConectado WRITE setConectado)
    Q_PROPERTY(int paginaActual READ getPaginaActual WRITE setPaginaActual)

public:
    AcolitoActividades(QWidget *parent = 0);
    ~AcolitoActividades();

    /*!
      Devuelve el estado de conexion del acolito
      @return bool
        - @b TRUE: Está conectado
        - @b FALSE: Está desconectado
      @note No modifica el objeto
      */

    bool isConectado() const;

    /*!
      Devuelve la pagina actual del acolito de actividades
      @return int, numero de pagina del acolito de actividades
      @note No modifica el objeto
      */

    int getPaginaActual() const;

signals:

    /*!
      Enviar una actividad para generar su ficha PDF
      */

    void solicitudFicha(QSqlRecord actividad);

    /*!
      Envia una lista de actividades para generar sus fichas
      */

    void solicitudListaFichas(QSqlQuery lista,QString dirSalida);

    void solicitudListaSala(QSqlQuery lista,QString sala,QString dir);

public slots:

    /*!
      Establece el estado de conexion del acolito
      @param estado Estado de conexion del acolito
            - @b TRUE: Conectar el acolito
            - @b FALSE: Desconectar el acolito
      @note Modifica el objeto
      */

    void setConectado(bool estado);

    /*!
      Limita el calendario de las actividades a las fechas concretas del evento
      @param intervalo  Intervalo de fechas del calendario donde se realizara el evento
      @note Modifica el objeto
      */

    void setIntervaloFechas(QPair<QDate,QDate> intervalo);

    /*!
      Vuelve a cargar los comboBox de actividades y días
      */

    void recargaActividadesYDias();

    /*!
      Recarga el comboBox de asociaciones
      */

    void recargaAsociaciones();

    /*!
      Recarga el comboBox de lugares
      */

    void recargaLugares();

    /*!
      Introduce nuevas asociaciones en el sistema
      */

    void nuevaAsociacion();

    /*!
      Introduce nuevas Actividades en el sistema
      */

    void nuevasActividadesDialog();

    /*!
      Dialogo para generar fichas diarias
      */

    void fichasDelDiaDialog();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::AcolitoActividades *ui;

    ModeloActividades *modelo;      ///< Modelo de actividades del widget
    QSortFilterProxyModel *filtro;  ///< Filtro de busqueda del widget
    QDataWidgetMapper *mapper;      ///< Mapper de conexiones del widget
    QSignalMapper *botonesMapper;   ///< Mapper de señales para los botones de cambio de página

    bool flagConexion;  ///< Flag de conexion del acolito

    /*!
      Prepara al acolito al crearse
      */

    void setup();

    /*!
      Crea los modelos
      */

    void creaModelos();

    /*!
      Elimina los modelos
      */

    void borraModelos();

    /*!
      Establece las conexiones entre los distintos elementos
      */

    void estableceConexiones();

    /*!
      Estado inicial
      */

    void init();

    /*!
      Prepara el calendario principal
      */

    void preparaCalendario();

    /*!
      Prepara los comboBox de busquedas de la vista
      */

    void preparaBusquedas();

private slots:

    /*!
      Avanza o retrocede la pagina
      */

    void cambiaPagina(int avanza);

    /*!
      Establece el filtro de seleccion para el modelo de actividades
      */

    void setSeleccion();

    /*!
      Añade actividades al sistema
      */

    void addActividades(QStandardItemModel *actividades);

    /*!
      Cambia de pagina el acolito de actividades
      */

    void setPaginaActual(int pagina);

    /*!
      Envia la actividad actual para generar su ficha pdf
      */

    void enviarActividad();

};

#endif // ACOLITOACTIVIDADES_H
